Taken from Gentoo, which adapted
https://github.com/agronholm/typeguard/commit/e0db07a777d5a481eaba6162354adf32286ce21b

diff --git a/src/typeguard/__init__.py b/src/typeguard/__init__.py
index 5684d63..27fa30b 100644
--- a/src/typeguard/__init__.py
+++ b/src/typeguard/__init__.py
@@ -61,22 +61,25 @@ except ImportError:
     from typing import _ForwardRef as ForwardRef
     evaluate_forwardref = ForwardRef._eval_type
 
-if sys.version_info >= (3, 10):
-    from typing import is_typeddict
-else:
-    _typed_dict_meta_types = ()
-    if sys.version_info >= (3, 8):
-        from typing import _TypedDictMeta
-        _typed_dict_meta_types += (_TypedDictMeta,)
+try:
+    from typing_extensions import is_typeddict
+except ImportError:
+    if sys.version_info >= (3, 10):
+        from typing import is_typeddict
+    else:
+        _typed_dict_meta_types = ()
+        if sys.version_info >= (3, 8):
+            from typing import _TypedDictMeta
+            _typed_dict_meta_types += (_TypedDictMeta,)
 
-    try:
-        from typing_extensions import _TypedDictMeta
-        _typed_dict_meta_types += (_TypedDictMeta,)
-    except ImportError:
-        pass
+        try:
+            from typing_extensions import _TypedDictMeta
+            _typed_dict_meta_types += (_TypedDictMeta,)
+        except ImportError:
+            pass
 
-    def is_typeddict(tp) -> bool:
-        return isinstance(tp, _typed_dict_meta_types)
+        def is_typeddict(tp) -> bool:
+            return isinstance(tp, _typed_dict_meta_types)
 
 
 if TYPE_CHECKING:
